home *** CD-ROM | disk | FTP | other *** search
/ Collection of Tools & Utilities / Collection of Tools and Utilities.iso / c / recio202.zip / rwarn.c < prev    next >
C/C++ Source or Header  |  1994-05-05  |  4KB  |  108 lines

  1. /*****************************************************************************
  2.    MODULE: rwarn.c
  3.   PURPOSE: recio warning functions
  4. COPYRIGHT: (C) 1994 William Pierpoint
  5.  COMPILER: Borland C Version 3.1
  6.        OS: MSDOS Version 6.2
  7.   VERSION: 2.02
  8.   RELEASE: May 5, 1994
  9. *****************************************************************************/
  10.  
  11. #include <errno.h>
  12. #include <stdio.h>
  13. #include <stdlib.h>
  14. #include <string.h>
  15.  
  16. #include "recio.h"
  17.  
  18. #define rflags(rp)       ((rp)->r_flags)
  19.  
  20. static void (*_r_warnfn)(REC *) = NULL; /* ptr to warning function */
  21.  
  22. /****************************************************************************/
  23. void                         /* returns nothing                             */
  24.     rclearwarn(              /* clears warning indicator                    */
  25.         REC *rp)             /* record pointer                              */
  26. /****************************************************************************/
  27. {
  28.     if (risvalid(rp)) {
  29.         rflags(rp) &= ~(_R_WRN * _R_WRNMAX);
  30.     } else {
  31.         rseterr(NULL, EINVAL);
  32.     }
  33. }
  34.  
  35. /****************************************************************************/
  36. void                             /* returns nothing                         */
  37.     rsetwarnfn(                  /* registers a callback warning function   */
  38.         void(*rwarnfn)(REC *rp)) /* pointer to warning function             */
  39. /****************************************************************************/
  40. {
  41.     _r_warnfn = rwarnfn;         /* point to callback warning function */
  42. }
  43.  
  44. /****************************************************************************/
  45. int                          /* returns warning number (0=no warning        */
  46.     rwarning(                /* gets warning number for record stream       */
  47.         REC *rp)             /* record pointer                              */
  48. /****************************************************************************/
  49. {
  50.     int warnum=0;            /* return warning number */
  51.  
  52.     if (risvalid(rp)) {
  53.          warnum = rflags(rp) / _R_WRN;
  54.          warnum &= _R_WRNMAX;
  55.     }
  56.     return (warnum);
  57. }
  58.  
  59. /****************************************************************************/
  60. int                          /* returns possibly modified warning number    */
  61.     rsetwarn(                /* sets warning number and calls warning fn    */
  62.         REC *rp,             /* record pointer                              */
  63.         int warnum)          /* warning number                              */
  64. /****************************************************************************/
  65. {
  66.     /* if valid record pointer */
  67.     if (risvalid(rp) && warnum <= _R_WRNMAX) {
  68.  
  69.         /* set warning number on stream */
  70.         rflags(rp) &= ~(_R_WRN * _R_WRNMAX);
  71.         rflags(rp) |= _R_WRN * warnum;
  72.  
  73.         /* invoke callback warning function */
  74.         if (_r_warnfn) _r_warnfn(rp);
  75.  
  76.         /* find out if warnfn() changed warning */
  77.         warnum = rwarning(rp);
  78.  
  79.     } else {
  80.         rseterr(rp, R_EINVAL);
  81.     }
  82.     return (warnum);
  83. }
  84.  
  85. /****************************************************************************/
  86. char *                       /* returns warning message                     */
  87.     rstrwarning(             /* gets warning message for rwarning number    */
  88.         int warnum)          /* warning number                              */
  89. /****************************************************************************/
  90. {
  91.     switch (warnum) {
  92.     case 0:         return ("no warning");
  93.     case R_WEMPSTR: return ("empty data string");
  94.     case R_WNOREG:  return ("unable to register function with atexit()");
  95.     case R_WWIDTH:  return ("data too wide for columnar output");
  96.     }
  97.     return ("unknown warning");
  98. }
  99.  
  100. /****************************************************************************/
  101. char *                       /* returns warning message                     */
  102.     rwarnstr(                /* gets warning message for record stream      */
  103.         REC *rp)             /* record pointer                              */
  104. /****************************************************************************/
  105. {
  106.     return (risvalid(rp) ? rstrwarning(rwarning(rp)) : rstrerror(R_EINVAL));
  107. }
  108.